﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Utils
{
    public static class Encryption
    {
        //Khai bao bien
        private static int KEYCODE = 11;

        //Tạo xâu khóa
        private static string CreateStrKeyCode()
        {
            string strValue = "";
            int i;
            for (i = '0'; i <= '9'; i++) strValue += (char)i;
            for (i = 'A'; i <= 'Z'; i++) strValue += (char)i;
            for (i = 'a'; i <= 'z'; i++) strValue += (char)i;
            strValue += "_ ";
            return strValue;
        }

        //Hàm mã hóa
        public static string EnCode(string strValue)
        {
            if (strValue == null) return "";
            string strEnCode="";
            string strKey = Encryption.CreateStrKeyCode();
            int k,l=strKey.Length;
            int intValue, intValuePre=0;
            for (int i = 0; i < strValue.Length; i++)
            {
                intValue = strValue.Substring(i, 1)[0];
                k = strKey.IndexOf((char)intValue);
                if (k != -1)
                {
                    strEnCode += strKey.Substring((k + intValuePre + KEYCODE) % l, 1);
                    intValuePre = k;

                }
                else
                {
                    strEnCode += (char)intValue;
                }
            }
            return strEnCode;
        }

        //Hàm giải mã
        public static string DeCode(string strValue)
        {
            if (strValue == null) return "";
            string strDeCode = "";
            string strKey = Encryption.CreateStrKeyCode();
            int k, l = strKey.Length;
            int intValue,intValuePre = 0;
            for (int i = 0; i < strValue.Length; i++)
            {
                intValue = strValue.Substring(i, 1)[0];
                k = strKey.IndexOf((char)intValue);
                if (k != -1)
                {
                    intValuePre = (k - intValuePre - KEYCODE + l*KEYCODE) % l;
                    strDeCode += strKey.Substring(intValuePre, 1)[0];
                }
                else
                {
                    strDeCode += (char)intValue;
                }
            }
            return strDeCode;
        }

        //Hàm kiểm tra một xâu có phải là PassWord không
        public static Boolean CheckPassWord(string strValue)
        {
            if (strValue == null) return false;
            string str = Encryption.CreateStrKeyCode();
            for (int i = 0; i < strValue.Length; i++)
            {
                if (str.IndexOf(strValue.Substring(i, 1)) == -1) return false;
            }
            return true;
        }

        //Hàm đưa một xâu về xâu chuẩn
        public static string Trim(string strValue)
        {
            if (strValue == null) return "";
            string str;
            int i;
            strValue = strValue.Trim();
            str = "";
            while (strValue != "")
            {
                i = strValue.IndexOf(' ');
                if (i != -1)
                {
                    str = str + strValue.Substring(0, i);
                    strValue = strValue.Substring(i).Trim();
                    str = str + " ";
                }
                else
                {
                    str = str + strValue;
                    strValue = "";
                }
            }
            return str;
        }

        //Hàm đưa một chuỗi thường thành chuỗi họ tên
        public static string FormatFullName(string strFullName)
        {
            if (strFullName == null) return "";
            string strTemp;
            int i;
            strFullName = Trim(strFullName);
            strTemp = "";
            while (strFullName != "")
            {
                strTemp = strTemp + strFullName.Substring(0, 1).ToUpper();
                strFullName = strFullName.Substring(1);
                if (strFullName == "") break;
                if (strFullName.Substring(0, 1) != "")
                {
                    i = strFullName.IndexOf(' ');
                    if (i != -1)
                    {
                        strTemp = strTemp + strFullName.Substring(0, i + 1);
                        strFullName = strFullName.Substring(i + 1);
                    }
                    else
                    {
                        strTemp = strTemp + strFullName;
                        strFullName = "";
                    }
                }
            }
            return strTemp;
        }
        public static string GetFirstChar(string strFullName)
        {
            if (strFullName == null) return "";
            string strTemp;
            int i;
            strFullName = Trim(strFullName);
            strTemp = "";
            while (strFullName != "")
            {
                strTemp = strTemp + strFullName.Substring(0, 1).ToUpper();
                strFullName = strFullName.Substring(1);
                if (strFullName == "") break;
                if (strFullName.Substring(0, 1) != "")
                {
                    i = strFullName.IndexOf(' ');
                    if (i != -1)
                    {
                        strTemp = strTemp + strFullName.Substring(i+1).ToUpper();
                        strFullName = strFullName.Substring(i+1);
                    }
                }
            }
            return strTemp;
        }

        //Kiểm tra xâu họ tên
        public static Boolean isFullName(string strFullName)
        {
            if (strFullName == null) return false;
            strFullName = Trim(strFullName);
            if (strFullName.IndexOf(' ') == -1) return false;
            string strTemp = "~`!@#$%^&*()-_+=|\\{[}]:;'<,>.?/\"";
            foreach (char ch in strFullName)
            {
                if (Char.IsNumber(ch)) return false;
                if (strTemp.IndexOf(ch) != -1) return false;
            }
            return true;
        }
        public static string ToUpperFirstChar(string str)
        {
            str.Trim();
            if (str.Length < 1) return null;
            return str.Substring(0, 1).ToUpper() + str.Substring(1);
        }

        //Lấy họ từ xâu họ tên
        public static string getFirstName(string strFullName)
        {
            strFullName = Trim(strFullName);
            if (strFullName.LastIndexOf(" ") == -1) return "";
            return strFullName.Substring(0, strFullName.LastIndexOf(" "));
        }

        //Lấy tên từ xâu họ tên
        public static string getLastName(string strFullName)
        {
            strFullName = Trim(strFullName);
            return strFullName.Substring(strFullName.LastIndexOf(" ") + 1);
        }
    
        private static string NumberCharacter(string ch)
        {
            string ret = "";
            switch (ch)
            {
                case "0":
                    ret = " không";
                    break;
                case "1":
                    ret = " một";
                    break;
                case "2":
                    ret = " hai";
                    break;
                case "3":
                    ret = " ba";
                    break;
                case "4":
                    ret = " bốn";
                    break;
                case "5":
                    ret = " năm";
                    break;
                case "6":
                    ret = " sáu";
                    break;
                case "7":
                    ret = " bảy";
                    break;
                case "8":
                    ret = " tám";
                    break;
                case "9":
                    ret = " chín";
                    break;
            }
            return ret;
        }
        public static string NumberToMoney(long Number)
        {
            string chr, ch, c1, c2, c3, s1, s2, s3, s4, ad, ss;
            s2 = "";
            ss = "";
            int leng, Count;
            if (Number < 0)
                ad = "âm";
            else
            {
                if (Number == 0) ad = "không";
                else ad = "";
            }
            chr = "000" + Number.ToString().Trim();
            leng = chr.Length;
            Count = 0;
            while (leng > 3)
            {
                Count += 1;
                ch = chr.Substring(chr.Length - 3);
                leng = leng - 3;
                chr = chr.Substring(0, leng);

                //c1
                c1 = NumberCharacter(ch.Substring(ch.Length - 1));
                c2 = NumberCharacter(ch.Substring(ch.Length - 2, 1));
                c3 = NumberCharacter(ch.Substring(0, 1));
                //c2
                //c3
                if ((c3 == " không") && (leng < 4))
                    s3 = "";
                else
                    s3 = c3 + " trăm";

                if (c2 == " một")
                    if (Number.ToString().Substring(0, 1) == "1")
                        s2 = " mười";
                    else
                        s2 = " mươi";
                else
                {
                    if (c2 != " không")
                        s2 = c2 + " mươi";
                    else
                    {
                        if ((s3.Length == 0) || (s3.Length != 0) && (c1 == " không"))
                            s2 = "";
                        else
                            s2 = " linh";
                    }
                }
                if ((c1 == " một") && (Convert.ToInt16(ch.Substring(2, 1)) > 1))
                {
                    s1 = " mốt";
                }
                else
                {
                    if (c1 == " không")
                        s1 = "";
                    else
                    {
                        if (c1 != " năm")
                            s1 = c1;
                        else
                        {
                            if ((s2.Length == 0) || (s2 == " linh"))
                                s1 = c1;
                            else
                                s1 = " lăm";
                        }
                    }
                }
                if (ch == "000")
                {
                    s4 = "";
                }
                else
                    s4 = s3 + s2 + s1;
                switch (Count)
                {
                    case 1:

                        ss = s4 + " đồng";
                        break;

                    case 2:
                    case 5:
                        if (s4.Length > 0)
                            ss = s4 + " nghìn" + ss;
                        else
                            ss = s4 + ss;
                        break;

                    case 3:
                    case 6:
                        if (s4.Length > 0)
                            ss = s4 + " triệu" + ss;
                        else
                            ss = s4 + ss;
                        break;

                    case 4:
                    case 7:
                        ss = s4 + " tỷ" + ss;
                        break;
                }

            }
            string Temp;
            Temp = ad + ss;
            Temp = Temp.Trim();
            Temp = Temp.Substring(0, 1).ToUpper() + Temp.Substring(1, Temp.Length - 1);
            return Temp;
        }        

        public static string GetMoneyString(long Number)
        {
            string NumberString = Number.ToString();
            string NumberGroupSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator;
            int k = 0; string Result = NumberString;
            for (int i = NumberString.Length - 1; i >= 0; i--)
            {
                if (k == 3)
                {
                    Result = Result.Insert(i + 1, NumberGroupSeparator);
                    k = 0;
                }
                k++;
            }
            return Result;
        }            
    }
}
